/*!art-template - Template Engine | http://aui.github.com/artTemplate/*/
!(function () {
    function a(a) {
        return a.replace(t, '').replace(u, ',').replace(v, '').replace(w, '').replace(x, '').split(y);
    }
    function b(a) {
        return (
            "'" +
            a
                .replace(/('|\\)/g, '\\$1')
                .replace(/\r/g, '\\r')
                .replace(/\n/g, '\\n') +
            "'"
        );
    }
    function c(c, d) {
        function e(a) {
            return (
                (m += a.split(/\n/).length - 1),
                k && (a = a.replace(/\s+/g, ' ').replace(/<!--[\w\W]*?-->/g, '')),
                a && (a = s[1] + b(a) + s[2] + '\n'),
                a
            );
        }
        function f(b) {
            var c = m;
            if (
                (j
                    ? (b = j(b, d))
                    : g &&
                      (b = b.replace(/\n/g, function () {
                          return m++, '$line=' + m + ';';
                      })),
                0 === b.indexOf('='))
            ) {
                var e = l && !/^=[=#]/.test(b);
                if (((b = b.replace(/^=[=#]?|[\s;]*$/g, '')), e)) {
                    var f = b.replace(/\s*\([^\)]+\)/, '');
                    n[f] || /^(include|print)$/.test(f) || (b = '$escape(' + b + ')');
                } else b = '$string(' + b + ')';
                b = s[1] + b + s[2];
            }
            return (
                g && (b = '$line=' + c + ';' + b),
                r(a(b), function (a) {
                    if (a && !p[a]) {
                        var b;
                        (b =
                            'print' === a
                                ? u
                                : 'include' === a
                                ? v
                                : n[a]
                                ? '$utils.' + a
                                : o[a]
                                ? '$helpers.' + a
                                : '$data.' + a),
                            (w += a + '=' + b + ','),
                            (p[a] = !0);
                    }
                }),
                b + '\n'
            );
        }
        var g = d.debug,
            h = d.openTag,
            i = d.closeTag,
            j = d.parser,
            k = d.compress,
            l = d.escape,
            m = 1,
            p = { $data: 1, $filename: 1, $utils: 1, $helpers: 1, $out: 1, $line: 1 },
            q = ''.trim,
            s = q ? ["$out='';", '$out+=', ';', '$out'] : ['$out=[];', '$out.push(', ');', "$out.join('')"],
            t = q ? '$out+=text;return $out;' : '$out.push(text);',
            u = "function(){var text=''.concat.apply('',arguments);" + t + '}',
            v = 'function(filename,data){data=data||$data;var text=$utils.$include(filename,data,$filename);' + t + '}',
            w = "'use strict';var $utils=this,$helpers=$utils.$helpers," + (g ? '$line=0,' : ''),
            x = s[0],
            y = 'return new String(' + s[3] + ');';
        r(c.split(h), function (a) {
            a = a.split(i);
            var b = a[0],
                c = a[1];
            1 === a.length ? (x += e(b)) : ((x += f(b)), c && (x += e(c)));
        });
        var z = w + x + y;
        g &&
            (z =
                'try{' +
                z +
                "}catch(e){throw {filename:$filename,name:'Render Error',message:e.message,line:$line,source:" +
                b(c) +
                ".split(/\\n/)[$line-1].replace(/^\\s+/,'')};}");
        try {
            var A = new Function('$data', '$filename', z);
            return (A.prototype = n), A;
        } catch (B) {
            throw ((B.temp = 'function anonymous($data,$filename) {' + z + '}'), B);
        }
    }
    var d = function (a, b) {
        return 'string' == typeof b ? q(b, { filename: a }) : g(a, b);
    };
    (d.version = '3.0.0'),
        (d.config = function (a, b) {
            e[a] = b;
        });
    var e = (d.defaults = { openTag: '<%', closeTag: '%>', escape: !0, cache: !0, compress: !1, parser: null }),
        f = (d.cache = {});
    d.render = function (a, b) {
        return q(a, b);
    };
    var g = (d.renderFile = function (a, b) {
        var c = d.get(a) || p({ filename: a, name: 'Render Error', message: 'Template not found' });
        return b ? c(b) : c;
    });
    d.get = function (a) {
        var b;
        if (f[a]) b = f[a];
        else if ('object' == typeof document) {
            var c = document.getElementById(a);
            if (c) {
                var d = (c.value || c.innerHTML).replace(/^\s*|\s*$/g, '');
                b = q(d, { filename: a });
            }
        }
        return b;
    };
    var h = function (a, b) {
            return (
                'string' != typeof a &&
                    ((b = typeof a), 'number' === b ? (a += '') : (a = 'function' === b ? h(a.call(a)) : '')),
                a
            );
        },
        i = { '<': '&#60;', '>': '&#62;', '"': '&#34;', "'": '&#39;', '&': '&#38;' },
        j = function (a) {
            return i[a];
        },
        k = function (a) {
            return h(a).replace(/&(?![\w#]+;)|[<>"']/g, j);
        },
        l =
            Array.isArray ||
            function (a) {
                return '[object Array]' === {}.toString.call(a);
            },
        m = function (a, b) {
            var c, d;
            if (l(a)) for (c = 0, d = a.length; d > c; c++) b.call(a, a[c], c, a);
            else for (c in a) b.call(a, a[c], c);
        },
        n = (d.utils = { $helpers: {}, $include: g, $string: h, $escape: k, $each: m });
    d.helper = function (a, b) {
        o[a] = b;
    };
    var o = (d.helpers = n.$helpers);
    d.onerror = function (a) {
        var b = 'Template Error\n\n';
        for (var c in a) b += '<' + c + '>\n' + a[c] + '\n\n';
        'object' == typeof console && console.error(b);
    };
    var p = function (a) {
            return (
                d.onerror(a),
                function () {
                    return '{Template Error}';
                }
            );
        },
        q = (d.compile = function (a, b) {
            function d(c) {
                try {
                    return new i(c, h) + '';
                } catch (d) {
                    return b.debug ? p(d)() : ((b.debug = !0), q(a, b)(c));
                }
            }
            b = b || {};
            for (var g in e) void 0 === b[g] && (b[g] = e[g]);
            var h = b.filename;
            try {
                var i = c(a, b);
            } catch (j) {
                return (j.filename = h || 'anonymous'), (j.name = 'Syntax Error'), p(j);
            }
            return (
                (d.prototype = i.prototype),
                (d.toString = function () {
                    return i.toString();
                }),
                h && b.cache && (f[h] = d),
                d
            );
        }),
        r = n.$each,
        s =
            'break,case,catch,continue,debugger,default,delete,do,else,false,finally,for,function,if,in,instanceof,new,null,return,switch,this,throw,true,try,typeof,var,void,while,with,abstract,boolean,byte,char,class,const,double,enum,export,extends,final,float,goto,implements,import,int,interface,long,native,package,private,protected,public,short,static,super,synchronized,throws,transient,volatile,arguments,let,yield,undefined',
        t = /\/\*[\w\W]*?\*\/|\/\/[^\n]*\n|\/\/[^\n]*$|"(?:[^"\\]|\\[\w\W])*"|'(?:[^'\\]|\\[\w\W])*'|\s*\.\s*[$\w\.]+/g,
        u = /[^\w$]+/g,
        v = new RegExp(['\\b' + s.replace(/,/g, '\\b|\\b') + '\\b'].join('|'), 'g'),
        w = /^\d[^,]*|,\d[^,]*/g,
        x = /^,+|,+$/g,
        y = /^$|,+/;
    (e.openTag = '{{'), (e.closeTag = '}}');
    var z = function (a, b) {
        var c = b.split(':'),
            d = c.shift(),
            e = c.join(':') || '';
        return e && (e = ', ' + e), '$helpers.' + d + '(' + a + e + ')';
    };
    (e.parser = function (a) {
        a = a.replace(/^\s/, '');
        var b = a.split(' '),
            c = b.shift(),
            e = b.join(' ');
        switch (c) {
            case 'if':
                a = 'if(' + e + '){';
                break;
            case 'else':
                (b = 'if' === b.shift() ? ' if(' + b.join(' ') + ')' : ''), (a = '}else' + b + '{');
                break;
            case '/if':
                a = '}';
                break;
            case 'each':
                var f = b[0] || '$data',
                    g = b[1] || 'as',
                    h = b[2] || '$value',
                    i = b[3] || '$index',
                    j = h + ',' + i;
                'as' !== g && (f = '[]'), (a = '$each(' + f + ',function(' + j + '){');
                break;
            case '/each':
                a = '});';
                break;
            case 'echo':
                a = 'print(' + e + ');';
                break;
            case 'print':
            case 'include':
                a = c + '(' + b.join(',') + ');';
                break;
            default:
                if (/^\s*\|\s*[\w\$]/.test(e)) {
                    var k = !0;
                    0 === a.indexOf('#') && ((a = a.substr(1)), (k = !1));
                    for (var l = 0, m = a.split('|'), n = m.length, o = m[l++]; n > l; l++) o = z(o, m[l]);
                    a = (k ? '=' : '=#') + o;
                } else a = d.helpers[c] ? '=#' + c + '(' + b.join(',') + ');' : '=' + a;
        }
        return a;
    }),
        'function' == typeof define
            ? define(function () {
                  return d;
              })
            : 'undefined' != typeof exports
            ? (module.exports = d)
            : (this.template = d);
})();
